package org.jeecg.modules.oms.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.oms.entity.SemiProductSalesOrderDetail;

import java.math.BigDecimal;
import java.util.List;

/**
 * 半成品销售订单明细Mapper接口
 */
public interface SemiProductSalesOrderDetailMapper extends BaseMapper<SemiProductSalesOrderDetail> {

    /**
     * 根据订单ID查询明细列表
     * @param orderId 订单ID
     * @return 明细列表
     */
    List<SemiProductSalesOrderDetail> selectByOrderId(@Param("orderId") String orderId);

    /**
     * 分页查询订单明细
     * @param page 分页参数
     * @param detail 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrderDetail> selectDetailPage(Page<SemiProductSalesOrderDetail> page, @Param("detail") SemiProductSalesOrderDetail detail);

    /**
     * 根据物料ID查询明细列表
     * @param materialId 物料ID
     * @return 明细列表
     */
    List<SemiProductSalesOrderDetail> selectByMaterialId(@Param("materialId") String materialId);

    /**
     * 根据物料编码查询明细列表
     * @param materialCode 物料编码
     * @return 明细列表
     */
    List<SemiProductSalesOrderDetail> selectByMaterialCode(@Param("materialCode") String materialCode);

    /**
     * 计算订单总金额
     * @param orderId 订单ID
     * @return 总金额
     */
    BigDecimal calculateTotalAmount(@Param("orderId") String orderId);

    /**
     * 计算订单总成本
     * @param orderId 订单ID
     * @return 总成本
     */
    BigDecimal calculateTotalCost(@Param("orderId") String orderId);

    /**
     * 统计订单明细数量
     * @param orderId 订单ID
     * @return 明细数量
     */
    Integer countByOrderId(@Param("orderId") String orderId);

    /**
     * 批量插入订单明细
     * @param detailList 明细列表
     * @return 插入数量
     */
    int batchInsert(@Param("detailList") List<SemiProductSalesOrderDetail> detailList);

    /**
     * 批量更新订单明细
     * @param detailList 明细列表
     * @return 更新数量
     */
    int batchUpdate(@Param("detailList") List<SemiProductSalesOrderDetail> detailList);

    /**
     * 根据订单ID删除明细
     * @param orderId 订单ID
     * @return 删除数量
     */
    int deleteByOrderId(@Param("orderId") String orderId);

    /**
     * 更新明细金额
     * @param id 明细ID
     * @param quantity 数量
     * @param unitPrice 单价
     * @param amount 金额
     * @param updateBy 更新人
     * @return 更新结果
     */
    int updateAmount(@Param("id") String id,
                    @Param("quantity") Integer quantity,
                    @Param("unitPrice") BigDecimal unitPrice,
                    @Param("amount") BigDecimal amount,
                    @Param("updateBy") String updateBy);
}
